import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.Font;  //
import java.awt.Color; 
/**
 * Write a description of class Jugador here.
 * 
 * @author (Karen Gonzalez) 
 * @version (29/05/14)
 */
public class Jugador extends Actor
{
    /**Variables de instancia*/
    private int nivel ;
    private int salto = 0;
    private int velocidad;
    private int saltar;
    private int piso;
    private int plataformaX;
    private int plataformaY;
    private Plataforma plataforma;
    private int toca;
    private CatchWorld mundo;
    private boolean llave;
    private Actor cat =null;
    private Actor roca=null;
    private int vidas;
    private Vida vidaJug;
    private int bandVidas;
    private Actor martillo;
    private Actor bala;
    private int bonusAleatorio = Greenfoot.getRandomNumber(5);
    private Dulce dulce;
    private Martillo mar;
    private Actor cupcake;
    private long lastTime= System.currentTimeMillis(); 
    private long elapsedTime = 0;
    private SimpleTimer st;
    private Vida vida;
    private int banVida;
    private int banVida2;
    private int contador;    
    private int contBonus;
    private Bonus bonus;
    private boolean bandN;
    private boolean bandB;
    private int inmune;
    
    /**Inicializacion de variables de instancia*/
    public Jugador()
    {
        mundo = (CatchWorld)this.getWorld();
        banVida = 1;
        banVida = 1;
        velocidad = 3;
        saltar = 0;
        piso = 0;
        vidas = 3;
        toca=0;      
        bandN = false;
        bandVidas = 0;
        llave = false;
        nivel = 1;
        st = new SimpleTimer();        
        contador = 0;
        contBonus = 0;
        bandB = true;
        inmune = 0;
        vida = new Vida(" " + vidas);
    }
    
    /**Metodo que agrega un objeto vida*/
    public void agregaLetrero( )
    {
        getWorld().addObject(vida, 358, 18);
    }    
    
    /**Metodo actua donde se le manda llamar a otros metodos*/
    public void act() 
    {                   
        if(nivel!=4)
        {
            MueveJugador(); 
            CaminaPlataforma();
            if(TocaLlave())     
            { 
                 CambiaNivel();               
            }
              
            if(bandB == true)
            {
              agregaBonus();
              agregaLetrero( );
              bandB =false;
            }         
            if(contBonus == 200 && bonus!=null)
            {
               mundo.removeObject(bonus);           
               bonus=null;
               contBonus = 0;
             }
            RestaVidas();
            contBonus++; 
        }
     }   
    
     /**Metodo para cambiar de nivel*/
    public int CambiaNivel()
    {
        switch(nivel)
        {
            case 1: 
                   nivel = 2;                     
                   mundo.nivel2();                   
                   agregaLetrero( );
                   break;
            case 2:
                   nivel = 3;
                   mundo.nivel3();
                   agregaLetrero( );
                   break;
            case 3:       
                   nivel = 4;
                   mundo.Gana();           
                   break;
        }        
        return nivel;
    }
    
    /**Metodo donde el jugador se dezplaza por todo el escenario **/
    public void MueveJugador()
   {       
         if(Greenfoot.isKeyDown ("left"))
        {
            if(this.getX() >= 15)
            {
                setImage("pizq.png");
                getImage().scale(50,50);
                setLocation(getX()-velocidad,getY());
            }
        }
        
        else if(Greenfoot.isKeyDown ("right"))
        {
            if(this.getX() <= 750)
            { 
                setImage("POCOYOderecha.png");
                getImage().scale(50,50);
                setLocation(getX()+velocidad,getY());
            }
        }        
        
        else if(Greenfoot.isKeyDown ("up") && salto == 0  &&  (TocandoPlataforma() || getY() >= 600-getImage().getHeight()/2-10 ))
        {
            if(this.getY() >= 30 )
            {
                salto = salto +1;
            }
            
        }
        saltar();
        if(salto == 25)
          salto = 0;

   }
   
   /**Metodo para que salte*/
    public void saltar()
    {
        if(salto!=0)
        {
            setLocation(getX(),getY()-10);          
            salto=salto+1;;
        }
    }
    
    /**Metodo booleano donde regresa verdadero si toca la plataforma*/
    public boolean TocandoPlataforma()
    {
        for(int i = -10; i<=10; i++)
        {
            if((getOneObjectAtOffset(i, getImage().getHeight()/2+5, Plataforma.class)!=null))
            return true   ;         
        }
        return false;
    }    
       
    /**Metodo gravedad, se manda llamar cuando el objeto no esa tocando plataforma*/
   public void gravedad()
   {
       if( this.getY() <= 570 )
       {
          setLocation(getX(), getY()+velocidad);
       }
   }
   
   /**Metodo para que identifique la plataforma*/
     public boolean CaminaPlataforma()
    {
       Actor p = getOneObjectAtOffset(-20,20,Plataforma.class);
       mundo= ((CatchWorld)getWorld());        
       if(p==null)
       gravedad();
       else
       if(p.getY() > this.getY())
       {
           setLocation(getX(), p.getY()-40);      
              return true;    
       }
       else
       setLocation(getX(), getY()+100);       
       return false;     
    }
    
    /***Metodo donde por medio de un numero aleatorio se agrega un bonus*/
    public boolean agregaBonus()
    {        
        Actor m = getOneIntersectingObject(Martillo.class);  
        
        if(bonusAleatorio == 1 )
        {            
            bonus = new Dulce();
            mundo.addObject(bonus, 261, 516);   
        }       
        else if(bonusAleatorio == 2)
        {
            bonus = new Martillo();
            mundo.addObject(bonus, 261, 516); 
            if(m!=null)
            {
                getWorld().removeObject(m);
            }
        }
        return true;        
    }     
    
    /**Metodo para verificar si toca el dulce*/
    public boolean TocaDulce()
    {
        Actor p = getOneIntersectingObject(Dulce.class);  
        if(p!= null)
        {
           getWorld().removeObject(p);
           return true;
        }
        return false;
    }

    /**Metodo para verificar si toca llave*/    
    public boolean TocaLlave()
    {
        if(isTouching(Llave.class))
          return true;
          else 
          return false;
    }       

    /**Metodo para verificar si toca gato*/    
    public boolean TocaGato()
    {
        int ban=1;
        if(nivel!=4){
        cat = getOneIntersectingObject(Gato.class);
       if(ban==1 && cat!=null)
       {
           return true;
       }}
       return false;        
    }       

    /**Metodo para verificar si toca la roca*/    
    public boolean TocaRoca()
    {
        if(nivel!=4)
       {
        roca = getOneIntersectingObject(Roca.class);        
       if(roca!=null )
       {
           getWorld().removeObject(roca);
           return true;
       }                
       }
       return false;     
    }
    
    /**Metodo para verificar si toca la bala*/    
    public boolean TocaBala()
    {
        int ban=1;
        bala = getOneIntersectingObject(Bala.class);
       if(ban==1 && bala!=null)
       {
           getWorld().removeObject(bala);
           return true;
       }
       return false;        
    }    

    /**Metodo para verificar si toca el martillo*/    
    public boolean TocaMartillo()
    {
        Actor mar;
       mar = getOneIntersectingObject(Martillo.class);
       if(mar!=null)
       {
           getWorld().removeObject(mar);
           return true;
       }
       return false;        
    }    
    
    /**Metodo donde se van restando vidas, conforme las conficiones dadas*/
    public void RestaVidas()
    {       
        int cont=0;
        int banToca = 1;
        if(nivel!=4){
        if(bonus!=null && TocaDulce()==true)
        {            
            vidas = vidas + 1;
        }        
       
        if(TocaRoca() == true || TocaGato() == true && banToca ==1 || TocaBala()==true )
        {                                             
            vidas--;
            if(vidas>=0)
            {
                if(vidas == 0)
                {                    
                    mundo.pierde();                    
                }
                else
                vida.despliega("" + vidas );
            }                        
            banToca = 0;
        }       
        }           
    }                      
}
       